package middleware

import (
	"data_service/models"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

// AuthRequired 检查用户是否已认证的中间件
func AuthRequired() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求头中获取用户ID和Token
		userID := c.GetHeader("X-User-ID")
		token := c.GetHeader("X-Token")

		// 如果X-Token为空，尝试从Authorization头获取Bearer Token
		if token == "" {
			authHeader := c.GetHeader("Authorization")
			if len(authHeader) > 7 && authHeader[:7] == "Bearer " {
				token = authHeader[7:]
			}
		}

		// 记录请求头信息用于调试
		fmt.Printf("Auth middleware - X-User-ID: %s, X-Token: %s\n", userID, token)

		// 检查用户ID和Token是否存在
		if userID == "" || token == "" {
			// 如果缺少认证信息，则中止请求并返回401 Unauthorized错误
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "需要认证"})
			return
		}

		// 根据用户ID查询数据库
		var user models.User
		if err := models.GetDB().First(&user, userID).Error; err != nil {
			// 如果找不到用户，则中止请求并返回401 Unauthorized错误
			fmt.Printf("Auth middleware - User not found for ID: %s\n", userID)
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "用户不存在"})
			return
		}

		// 验证Token
		if !models.ValidateUserToken(userID, token) {
			fmt.Printf("Auth middleware - Invalid token for user ID: %s\n", userID)
			c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "无效的Token"})
			return
		}

		// 将用户信息存储在当前请求的上下文中，以便后续处理器使用
		c.Set("user", user)

		// 继续处理请求链中的下一个中间件或处理器
		c.Next()
	}
}